package com.springboot.springautowired.javaDesignModel.proxyModel;

import net.sf.cglib.proxy.Enhancer;

import java.lang.reflect.Method;

/**
 * 操作类
 */
public class CglibOperation {
    public static void operation() {
        //设置代理对象生成对象Enhancer--类比Proxy
        //==1.准备代理对象的准备阶段--需要生成代理对象的工具，增强被代理对象的增强方法
        CglibProxy cglibProxy = new CglibProxy();
        Enhancer enhancer = new Enhancer();
        //cglib是基于继承的动态代理，通过继承被代理对象实现代理
        enhancer.setSuperclass(Base.class);
        //被代理类需要指定增强方法
        enhancer.setCallback(cglibProxy);
        //==2.创建代理对象
        Base base = (Base) enhancer.create();
        base.add();

        Class<? extends Base> baseClass = base.getClass();
        //查看增强过的类的父类是不是未增强的Base类
        System.out.println("增强过的类的父类：" + baseClass.getSuperclass().getName());
        System.out.println("============打印增强过的类的所有方法==============");
        Method method = baseClass.getMethods()[0];
        String name = method.getName();
        System.out.println("name = " + name);

        //没有被增强过的base类
        Base base2 = new Base();
        System.out.println("未增强过的类的父类：" + base2.getClass().getSuperclass().getName());
        System.out.println("=============打印增未强过的目标类的方法===============");
        Method method1 = base2.getClass().getMethods()[0];
        String name1 = method1.getName();
        System.out.println("name1 = " + name1);
    }
}
